//
//  WBStatusListViewModel.swift
//  XLWB
//
//  Created by MacBook on 16/7/2.
//  Copyright © 2016年 MacBook. All rights reserved.
//

import Foundation
import SDWebImage

//上拉刷新最大尝试次数
private let maxPullupTryTimes = 3
//MARK--微博数据处理,字典转模型,下拉\上拉
class WBStatusListViewModel {

    //微博视图模型数组懒加载
    lazy var statusList = [WBStatusViewModel]()
    
    //上拉刷新错误次数
    private var pullupErrorTimes = 0
    
    //加载微博列表,parameter completion: 完成回调[网络请求是否成功]
    func loadStatus(pullup: Bool, completion: (isSuccess: Bool, shouldRefresh: Bool) -> ()) {
        
        //判断是否是上拉,检查刷新错误
        
        if pullup && pullupErrorTimes > maxPullupTryTimes {
            
            completion(isSuccess: true, shouldRefresh: false)
            return
        }
    
        //since_id 取出数组中一条微博id
        let since_id = pullup ? 0 : (statusList.first?.status.id ?? 0)
        
        //上拉刷新,取出最后一个
        let max_id = !pullup ? 0 : (statusList.last?.status.id ?? 0)
        
    WBNetworkManager.shared.statusList(since_id: since_id,max_id: max_id) { (list,isSuccess) in
    //判断网络请求是否成功
        if !isSuccess {
        
        //直接回调返回
            completion(isSuccess: false,shouldRefresh: false)
            return
        }
        
    //字典转模型(所有的第三方框架都支持嵌套的字典转模型)

        //1.定义结果可变数组
        var array = [WBStatusViewModel]()
        
        //2.遍历服务器返回的字典数组,字典转模型
        for dict in list ?? [] {
        
           print(dict["pic_urls"])

//
//
            //创建微博模型
            let status = WBStatus()
            
            //使用字典设置模型数值
            status.yy_modelSet(with: dict)
            
            //使用'微博' 模型床下"微博视图" 模型
            let viewModel = WBStatusViewModel(model: status)
            
            //添加到数组
            array.append(viewModel)
            
    }
        
        print("刷新到\(array.count) 条数据 \(array)")
    //拼接数据
        
        if pullup {
            
                        //上拉刷新后,将结果拼接在末尾
                        self.statusList += array
            
                    } else {
            
                       //下拉刷新,将结果拼接在最前
                        self.statusList = array + self.statusList
                    }

        
    //下拉刷新
        if pullup && array.count == 0 {
        
            self.pullupErrorTimes += 1
            
            completion(isSuccess: isSuccess,shouldRefresh: false)
        
        } else {
            
        
            self.cacheSingleImage(list: array,finished: completion)
//        //完成回调
//            completion(isSuccess: isSuccess, shouldRefresh: true)
//        
        
        }
    }
  }
    
    
    //缓存本次下载微博数据数组中的单张图像
    private func cacheSingleImage(list: [WBStatusViewModel], finished: (isSuccess: Bool, shouldRefresh: Bool)->()) {
    
        //调度组
        let group = DispatchGroup()
        
        //记录数据长度
        var length = 0
        
        //遍历数组,查找微博数据中有单张图像的进行缓存
        for vm in list {
            
            if vm.picURLs?.count != 1 {
                continue
            }
            
            //代码执行到此数组中只能有一张图片
            guard let pic = vm.picURLs?[0].thumbnail_pic,
                let url = URL(string: pic) else {
                
                    continue
            }
            print("要缓存的URL是 \(url)")
            
            // 1) downloadImage 是 SDWebImage 的核心方法
            // 2) 图像下载完成之后，会自动保存在沙盒中，文件路径是 URL 的 md5
            // 3) 如果沙盒中已经存在缓存的图像，后续使用 SD 通过 URL 加载图像，都会加载本地沙盒地图像
            // 4) 不会发起网路请求，同时，回调方法，同样会调用！
            // 5) 方法还是同样的方法，调用还是同样的调用，不过内部不会再次发起网路请求！
            // *** 注意点：如果要缓存的图像累计很大，要找后台要接口！

            //a.入组
            group.enter()
            
            SDWebImageManager.shared().downloadImage(with: url, options: [], progress: nil, completed: { (image, _, _, _, _) in
                
                //将图像转换成二进制
                if let image = image,
                    data = UIImagePNGRepresentation(image) {
                
                    length += data.count
                
                    //图片缓存成功,更新配体视图的大小
                    vm.updateSingleIamgeSize(image: image)
                }
                print("缓存的图像是\(image) 长度\(length)")
                
                //b.出组
                group.leave()
                
            })
            
        }
        //c监听调度组情况
        group.notify(queue: DispatchQueue.main) { 
            print("图像缓存完成\(length / 1024)k")
            
            //执行闭包回调
            finished(isSuccess: true, shouldRefresh: true)
        }
    }
}
